网站导航:首页开源项目 USB开源项目:Easy USB 51 Programer  

目录导航

   
  1、项目简介
USB开发基础
1、USB接口的优点及开发难易度
2、USB设备的开发流程
3、USB接口芯片(USB控制器)的选择
4、了解USB的通讯过程
5、USB命令(请求)和USB描述符
6、实例讲解USB的枚举(配置)过程
准备工作
1、需要哪些工具
2、电路原理图
3、手工制作您的电路板
4、测试您的硬件
HID设备类
1、让PC机找到我们的硬件
2、如何成为一个HID设备(模拟鼠标)
3、如何成为一个HID设备(模拟键盘)
4、如何与HID设备通讯(一)
5、如何与HID设备通讯(二)
6、51编程器的实现
Windows USB 驱动程序(自定义设备)
1、Windows驱动开发基础
2、开发环境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的实例—驱动我们的实验板
6、真正的实例—测试驱动程序
7、真正的实例—控制LED及读取按键状态
8、如何编写应用程序
   

相关产品    淘宝网店
     
 

 
  更多...  
 
 
第一个实例-Hello Wdm(二) 查看/参与此开源项目相关讨论
 

3、测试驱动程序

  切换到DriverMonitor,我们可以找到“Message text”列中有以“HelloWdm:”开始的字符串,这是驱动程序发出的调试信息,如下图所示:

  下面我们用HelloWdm实例中自带的测试程序进行测试。切换到VC6,选择菜单“Project”->“Set Active Project”->“Hello App”,如下图所示:

  编译测试程序:选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(如果编译不成功,确认是否配置好“DDK Build Settings”

  运行测试程序:按Ctrl+F5,将弹出基于命令行模式的测试程序,如下图所示:

  切换到DriverMonitor,我们发现驱动程序又发出了三条调试信息,如下图所示:

  大家可以分析这个驱动程序的结构,不过您如果不是专业驱动开发人员的话,建议不要探索的过深,因为Windows设备驱动程序太过于庞大和复杂了,我自已也只是略懂一点点皮毛^_^。

4、小试身手

  一般Hello World类程序都会输出一个“Hello World”字符串,但Hello Wdm却没有,下面我们来修改一下这个驱动程序,让它变更生动一点,也输出一个“Hello Wdm”字符串。我们来实现这样一个功能:向设备写入字符串“Hello Wdm!!!”,然后设备再将收到的字符串“显示”出来。Windows系统中一般通过调用WriteFile来向设备写入数据,通过“基础知识”一节,我们知道调用WriteFile时最终会转化为对驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程的调用,下面我们来增加驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程。

  通过查看DriverWorks的帮助文档,得知实现IRP_MJ_WRITE的功能函数原型为KDevice::Write,我们来继承它。

  1)在HelloDev.h中找到以下内容:

 
  1. virtual NTSTATUS Create(KIrp I);                // COMMENT_ONLY   
  2. virtual NTSTATUS Close(KIrp I);                 // COMMENT_ONLY   
  3. virtual NTSTATUS DeviceControl(KIrp I);         // COMMENT_ONLY   
  4. virtual NTSTATUS SystemControl(KIrp I);         // COMMENT_ONLY   

在后面加入:

 
  1. ////////////////Added by www.baiheee.com//////////////////////////////   
  2. virtual NTSTATUS Write(KIrp I);                 // COMMENT_ONLY   
  3. ///////////////////////////////////end////////////////////////////////////////////////   

  2)还要在function.h中加入

 
  1. /////////added by www.baiheee.com//////////   
  2. #define DRIVER_FUNCTION_WRITE   
  3. ////////////////end////////////////////////   

  3)在HelloDev.c中实例化Write功能函数,加入的内容如下:

 
  1. //////////////////////////Added by www.baiheee.com//////////////   
  2. //Dispatch routine for IRP_MJ_WRITE requests.   
  3. //   
  4. NTSTATUS SimpleWdmDevice::Write(KIrp I)   
  5. {   
  6.     NTSTATUS status = STATUS_SUCCESS;   
  7.   
  8.     T << "entered the write handler\n";     //输出调试信息   
  9.   
  10.     PUCHAR pBuffer  = (PUCHAR) I.UserBuffer();   
  11.   
  12.     DbgPrint("%s",pBuffer); //在调试窗口中输出通过WriteFile发过来的字符串       
  13.   
  14.     return I.PnpComplete(this, status);   
  15. }   
  16. ////////////////////////////////end////////////////////////////   

  4)选择菜单“Build”->“Batch Build”编译驱动程序,然后重新安装编译好的驱动程序。

  5)在HelloApp.cpp中定位到main函数,找到下面语句

 
  1. CloseHandle(hHello);  

在前面加入以下这段代码:

 
  1. ///////////////Added by www.baiheee.com/////////////////   
  2. BOOL bWriteSuccess;   
  3. DWORD dwByteWrite;   
  4. //利用WriteFile向设备写数据   
  5. bWriteSuccess   = WriteFile(hHello,("Hello Wdm!!!\n"),   
  6.                    sizeof(("Hello Wdm!!!\n")),&dwByteWrite,NULL);   
  7.   
  8. if(bWriteSuccess)   
  9. {   
  10.     cout << "WriteFile operation ok\n";   
  11. }   
  12. else  
  13. {   
  14.     cout << "WriteFile operation failed, code=" << GetLastError() << endl;   
  15. }   
  16. //////////////////////////End///////////////////////////   

  6)选择菜单“Build”->“Batch Build”,编译驱动程序,然后重新安装驱动程序。

  7) 选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(编译前确认是否配置好“DDK Build Settings”),然后执行编译后的测试程序,我们可以看到运行后的结果,如下图所示:

 

测试程序的运行结果

DriverMonitor监测到调试信息

下载编译好的驱动

下载测试程序(需要在命令行模式运行程序,否则窗口一闪而过,看不到运行结果)

下载源代码

 
 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4